# 代理模式
# => ⭐为其他对象提供一种代理以控制对这个对象的访问。
# => ⭐代理可以在访问前后添加额外的逻辑，如权限验证、缓存、延迟加载等
# => ⭐代理模式的主要作用是控制访问，它可以在访问对象时添加额外的功能，如权限验证、缓存、延迟加载等。

# 代理模式结构中包含如下角色：
# 1. Subject（主题）：定义了 RealSubject 和 Proxy 的共用接口，这样就在任何使用 RealSubject 的地方都可以使用 Proxy。
# 2. RealSubject（真实主题）：定义了具体的业务逻辑。
# 3. Proxy（代理）：保存一个引用使得代理可以访问实体，并提供一个与 Subject 的接口相同的接口，这样代理就可以用来替代实体。
# 4. Client（客户端）：使用 Subject 接口与 RealSubject 对象进行交互。

from abc import ABCMeta, abstractmethod

class Subject(metaclass=ABCMeta):
    @abstractmethod
    def request(self):
        pass

class RealSubject(Subject):
    def request(self):
        print("RealSubject request")

class Proxy(Subject):
    def __init__(self):
        self.real_subject = RealSubject()

    def request(self):
        print("Proxy request")
        self.real_subject.request()

if __name__ == "__main__":
    proxy = Proxy()
    proxy.request()
    # Output: Proxy request RealSubject request


# 代理模式和外观模式区别